
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dbf;

/**
 *
 * @author André
 */

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import org.geotools.data.shapefile.dbf.DbaseFileReader;

public class DBFdata {

    
    /*
     * Método básico criado para retornar o número de colunas existentes nas tabelas do arquivo dbf.
     */
    public static int numeroColunas(File f) throws IOException {

        FileInputStream fis = new FileInputStream( f );
            DbaseFileReader dbfReader =  new DbaseFileReader(fis.getChannel(),
            false,  Charset.forName("ISO-8859-1"));
       
       int colunas =   0;
        ///////////////////////ALteraçao
            while(colunas!=dbfReader.getHeader().getNumFields())//obtem o numero de colunas
            {
               colunas++;

            }
            dbfReader.close();
            fis.close();
        return colunas;
    }

    /*
     * Fez-se necessário este método porque o modelo JTable precisa de um vetor com o título de todas
     * colunas a serem utilizadas na tabela. Assim, esse método retira do dbf somente os campos da
     * primeira linha do mesmo e os agrupo em um vetor de dimensão igual ao número de colunas do
     * próprio arquivo dbf.
     */
    public static String[] cabecalhoTabela(File f) throws FileNotFoundException, IOException {

         FileInputStream fis = new FileInputStream( f );
            DbaseFileReader dbfReader =  new DbaseFileReader(fis.getChannel(),
            false,  Charset.forName("ISO-8859-1"));

            String[] cabecalho = new String[dbfReader.getHeader().getNumFields()];

        cabecalho[0] = dbfReader.getHeader().getFieldName(0);

        for (int i = 1; i < dbfReader.getHeader().getNumFields(); i++) {
            cabecalho[i] = dbfReader.getHeader().getFieldName(i);
        }
         dbfReader.close();
            fis.close();
        return cabecalho;
    }

//
//    /* FATOS:
//     * A biblioteca "jbdf.jar" possui um método contador de colunas, sendo ele: "dbf.getFieldCount()"
//     * A biblioteca "jbdf.jar" NÃO possui um método contador de linhas, sendo assim, a construção
//     *      abaixo foi criada para servir como um contador de linhas da maneira mais simples possível;
//     * O valor do número de linhas será o próprio contador do laço em questão.
//     */
    public static int numeroLinhas(File f) throws IOException {

       FileInputStream fis = new FileInputStream( f );
            DbaseFileReader dbfReader =  new DbaseFileReader(fis.getChannel(), false,  Charset.forName("ISO-8859-1"));

        int numeroDeLinhasDoDBF=0;
         while ( dbfReader.hasNext() ){
            numeroDeLinhasDoDBF++;
            Object[] fields = dbfReader.readEntry();
                //System.out.print(dbfReader.readRow());

             //   System.out.print(dbfReader.getFieldName());
               for (int j = 0; j < fields.length; j++)
               {              }
        if(numeroDeLinhasDoDBF>50){break;}//so teste
        }
        dbfReader.close();
            fis.close();
        return numeroDeLinhasDoDBF;
    }

    public static String matrizDados(File f, int a, int b) throws IOException {

       FileInputStream fis = new FileInputStream( f );
       DbaseFileReader dbfReader =  new DbaseFileReader(fis.getChannel(), false,  Charset.forName("ISO-8859-1"));

      // int linhasDBF = DBFdata.numeroLinhas(f);

       String elemento = " ";
      // Object elemento [] = null;
       
        
        for (int i = 0; i<DBFdata.numeroLinhas(f); i++) {
           // System.out.println("TESTE LINHA : "+ i);
            Object aobj[] = dbfReader.readEntry();
            for (int j = 0; j < aobj.length; j++) {
                if(aobj[j]==null)
                {
                    aobj[j] = "";
                   // System.out.println(aobj[j]);
                    //elemento = aobj[j].toString();
                }
                if(i==a && b==j)
                {
                    elemento = aobj[j].toString();
                }

                }

            }
      
        



            dbfReader.close();
            fis.close();
        return elemento;
    }
}

